package com.tbit.uqbike.webmanager.util.csv.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;


@Data
@Component
@RefreshScope
public class CsvExportConfig {

    /**
     * 开启定时任务下载
     */
    @Value("${csvExport.enable:true}")
    private Boolean enable;

    /**
     * 核心线程数
     */
    @Value("${csvExport.corePoolSize:4}")
    private Integer corePoolSize;

    /**
     * 最大线程数
     */
    @Value("${csvExport.maxPoolSize:8}")
    private Integer maxPoolSize;
    /**
     * 队列容量
     */
    @Value("${csvExport.queueCapacity:1024}")
    private Integer queueCapacity;

    @Value("${csvExport.keepAliveTime:100}")
    private Integer keepAliveTime;

    @Value("${csvExport.tempPath:temp}")
    private String tempPath;
    /**
     * oss的过期时间 ms
     */
    @Value("${csvExport.ossExpire:604800000}")
    private Long ossExpire;

    /**
     * 比例 例如proportion=2，查询01-04的数据，将会分成两个线程分别查询01-02、03-04的数据
     */
    @Value("${csvExport.proportion:3}")
    private Integer proportion;

    /**
     * 写线程的休眠时间
     */
    @Value("${csvExport.wait:500}")
    private Integer wait;

    /**
     * 名称
     */
    @Value("${csvExport.oss.bucketName:gx-execl}")
    private String bucketName;

    /**
     * 单次任务查询最大数据
     */
    @Value("${csvExport.big.data.query.count:5000}")
    private Integer bigDataQueryCount;
    /**
     * 队列中的最多允许存在的数据量
     * */
    @Value("${csvExport.max.queue.item.num:50000}")
    private Integer maxQueueItemNum;
    /**
     * 队列中数据量达到最大值线程要等待的时间
     * */
    @Value("${csvExport.max.queue.item.num.wait:1500}")
    private Integer maxQueueItemNumWait;

    @PostConstruct
    public void init() {
        //没有配置默认为cpu核的一半
        int poolSize = Runtime.getRuntime().availableProcessors();
        poolSize = Math.max(poolSize / 2, 2);
        if (maxPoolSize == 0) {
            maxPoolSize = poolSize;
        }
        if (corePoolSize == 0) {
            corePoolSize = poolSize;
        }
    }
}
